/* CsJni - .NET / Java Bridge
 * 
 * Copyright 2010 Robert E. Burke Licensed under the Apache License, Version 
 * 2.0 (the "License"); you may not use this file except in compliance with 
 * the License. You may obtain a copy of the License at 
 * http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable 
 * law or agreed to in writing, software distributed under the License is 
 * distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY 
 * KIND, either express or implied. See the License for the specific language 
 * governing permissions and limitations under the License. 
*/

using System;
using System.Collections.Generic;
using System.Text;
using System.Runtime.InteropServices;

namespace CsJni
{
    internal struct JavaVMAttachArgs : IDisposable
    {
        public /* jint */ int version;
        public /* char* */ IntPtr name;
        public /* jobject */ IntPtr group;

        public JavaVMAttachArgs(JniVersion jniVersion, string theName, JniObject groupHandle)
        {
            this.version = (int)jniVersion;
            this.name = IntPtr.Zero;
            if (theName != null)
            {
                this.name = Marshal.StringToHGlobalAnsi(theName);
            }
            group = (groupHandle == null) ? IntPtr.Zero : groupHandle.Handle;
        }

        #region IDisposable Members

        public void Dispose()
        {
            Dispose(true);
            GC.SuppressFinalize(this);
        }

        #endregion IDisposable Members

        private void Dispose(bool disposing)
        {
            if (!disposing && !Environment.HasShutdownStarted)
            {
                throw new JniException(JniResourceManager.Instance.GetString("invalidDisposableFinalizer"));
            }
            if (name != IntPtr.Zero)
            {
                Marshal.FreeHGlobal(name);
                name = IntPtr.Zero;
            }
            group = IntPtr.Zero;
        }
    }

    public sealed class JavaVMThreadAttachArguments
    {
        private string mName;
        private JniObject mGroupHandle;

        public JavaVMThreadAttachArguments(string name, JniObject groupHandle)
        {
            mName = name;
            mGroupHandle = groupHandle;
        }

        internal JavaVMAttachArgs ToArgs(JniVersion jniVersion)
        {
            return new JavaVMAttachArgs(jniVersion, mName, mGroupHandle);
        }

        internal static void FreeArgs(JavaVMAttachArgs args)
        {
            args.Dispose();
        }
    }
}
